/*
 * StorageResource.h
 *
 *  Created on: 04/10/2009
 *      Author: nik0l4z
 */

#ifndef STORAGERESOURCE_H_
#define STORAGERESOURCE_H_

#include "../Strategies/Index/IndexStrategy.h"
#include "../Strategies/Storage/StorageStrategy.h"
#include "../Strategies/Resource/ResourceStrategy.h"
#include "../Externa/Dato.h"
#include <list>
#include "../Externa/Clave.h"
using namespace std;



class StorageResource {

	private: IndexStrategy *indexStategy;
	private: StorageStrategy *storageStrategy;
	private: ResourceStrategy *resourceStrategy;

	private: Clave *clave;

	private: bool compressMode;

	/*Estructuras donde se almacenan los datos*/
	private: Dato *data;
	private: list<Dato*> dataList;
	list<Dato*>::iterator iterator;
	public: enum indexType {BSharp , Hash, SecuencialIndex, BlackHole };
	/*----------------------------------------*/

	public : StorageResource();

	public : virtual ~StorageResource();


	/*Metodo creado para probar polimorfismo*/
	public: void Saludar();

	/*-----------------Metodos de ABM---------------------------------------------------------------------------*/

	/*Persiste el dato segun las estrategias seteadas*/
	public: void saveData();

	/*Borra el dato cuya clave es pasada por parametro*/
	public: void deleteData(Clave *clave);

	/*Borra los datos cuyas claves son pasados por parametro en la lista*/
	public: void deleteData(list<Clave*> clave);

	/*Modifica los datos*/
	public: void updateData(Dato *data,Clave *clave);

	/*Modifica los datos*/
	public: void updateData(list<Dato*> datos);

	/*Devuelve el dato con clave igual a la recibida por parametro*/
	public: Dato* getData(Clave *clave);

	/**
	 * Metodo privado que guarda solo 1 dato, dicho metodo luego es invocado dentro de un ciclo cuando se quiera
	 * guardar una lista de datos.
	 **/
	private: void saveSingleData(Dato* dato,Clave *clave);

	/**
	 * Metodo privado que guarda un dato, en el caso de que la estrategia indice fuera Hash
	 *
	 */

	private: void saveSingleDataHash(Dato *data,Clave *clave);

	/**
	 * Metodo privado que guarda un dato, en el caso de que la estrategia indice fuera B Sharp
	 *
	 */

	private: void saveSingleDataBSharp(Dato *data,Clave *clave);

	/**
	 * Metodo privado que elimina el dato con clave igual a la ingresada por parametro, en el caso de que el indice fuera Hash
	 *
	 */
	private: void deleteDataHash(Clave *clave);

	/**
	 * Metodo privado que elimina el dato con clave igual a la ingresada por parametro, en el caso de que el indice fuera B Sharp
	 *
	 */
	private: void deleteDataBSharp(Clave *clave);

	/**
	 * Metodo privado que actualiza el dato con clave igual a la ingresada por parametro, en el caso de que el indice fuera Hash
	 *
	 */
	private: void updateDataHash(Dato *data,Clave *clave);

	/**
	 * Metodo privado que actualiza el dato con clave igual a la ingresada por parametro, en el caso de que el indice fuera B Sharp
	 *
	 */
	private: void updateDataBSharp(Dato *data,Clave *clave);


	void updateIndexByList(list <string>* datosPersistidos, int offset);


	/*-----------------------------------------------------------------------------------------------------------*/


	/*-------------------Getter & Setters---------------------------------*/
	public: virtual IndexStrategy *getIndexStategy() const;

	public: virtual ResourceStrategy *getResourceStrategy() const;

	public: virtual StorageStrategy *getStorageStrategy() const;

	public: Clave *getClave() const;

	public: Dato *getDato() const; // Agregado por Hernan

	public: bool getCompressMode() const;

	public: void setResourceStrategy(ResourceStrategy *resourceStrategy);

	public: void setStorageStrategy(StorageStrategy *storageStrategy);

	public: void setIndexStategy(IndexStrategy *indexStategy);

	public: void setClave(Clave *clave);
	/*Asocia un dato al recurso*/
	public: void setData(Dato *data);

	/*Asocia una lista de datos al recurso*/
	public: void setData(list<Dato*> dataList);

	public: void setCompressMode(bool compressMode);


    /*---------------------------------------------------------------------*/

};

#endif /* STORAGERESOURCE_H_ */


